{# The assistant's voice, in the one modal: what a live call runs on (where the mount takes calls: ``call_rows``, ``calling``), the voice profiles, each with a preview; switch, make one from the active, or edit one; and how terms are said. ``view`` picks the piece: the composer's chip, the list, one voice's form, or the pronunciation list. Previews play through voice.js's Listen handler ([data-speak]). #} {% from "components/macros/icons.html" import icon %} {% from "components/macros/chat.html" import model_row, voice_chip, speak_button %} {% from "components/macros/form.html" import action, field, text_input, number_input, select, primary_button %} {% from "components/macros/feedback.html" import error_banner, empty_state %} {% from "components/macros/layout.html" import dialog_title %} {% from "components/macros/table.html" import data_table %} {% if view == "chip" %} {{ voice_chip(active, path, calling) }} {% elif view == "list" %} {% if chip_oob %}{{ voice_chip(active, path, calling, oob=True) }}{% endif %}
No live model can be reached: a call needs an OpenAI or Google key with a realtime model in the catalog.
{% endif %}How every voice says terms like Traefik. {{ action("Pronunciation", hx_dialog(path ~ "/pronunciation", "data-pronunciations")) }}
{# A new voice starts as a copy of the one in use, then opens to edit. #}